1. Shell正则之Grep

通配符及特殊符号

*        #所有
.        #当前目录
..        #当前目录的上一级目录
-        #当前目录的上一次所在的目录
~        #家目录
#        #注释,超级管理员的命令行提示符
$        #引用变量,普通用户的命令行提示符
?        #匹配任意一个字符,必须是一个#非,取反
[]        #匹配中括号中任意一个字符
{}        #生成序列,整体
[^]        #排除中括号中所有字符
``        #优先执行反引号里面的命令
$()        #优先执行里面的命令
&&        #前面一个命令执行成功,才会执行后面的命令
||        #前面的命令执行失败,才会执行后面的命令
|        #管道,将前面的命令的输出结果交给管道后面的命令
\        #转义字符,取消一些特殊字符的含义
&        #将程序放到后台运行


正则表达式

注意事项:

正则神坑    中文字符

正则符号 基础正则  扩展正则

RE

BRE  ERE


^        #开头
$        #结尾
^$        #空行
\        #转义字符
.        #任意一个字符,除了换行符
[]        #匹配中括号中的任意一个字符
[^]        #匹配[^]之外的所有字符
[a-z]    #匹配所有小写字母
[0-9]
?        #匹配前面的字符出现0次或者1次        #扩展
*        #匹配前面的字符出现0次或者0次以上
+        #匹配前面的字符出现1次或者1次以上        #扩展
.*        #所有
()        #整体,后向引用,创建一个用于匹配的字符串   #扩展
{n}        #n数字, 前面的字符出现n次
{n,}    #前面的字符至少出现n次
{n,m}    #前面的字符出现至少n次,最多m次   n<m
{,m}    #前面的字符最多出现m次
|        #或者                    #扩展正则


特定的字符

[[:upper:]]   所有大写字母
[[:lower:]]      所有小写字母
[[:alpha:]]      所有字母
[[:space:]]      所有空白字符
[[:digit:]]      所有数字
[[:alnum:]]      所有字母和数字
[[:punct:]]      所有特殊符号

grep      #三剑客老三  过滤  过滤出来的内容是有颜色

[root@shell /scripts/shell13]# alias 
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto --time-style=long-iso'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'


选项:

    -i        #忽略大小写
    -v        #排除
    -n        #显示过滤出来的内容所在文件的行号
    -c        #将过滤出来的内容进行统计
    -w        #精确匹配
    -o        #只显示过滤出来的内容
    -E        #支持扩展正则
    -r        #递归过滤
    -R        #递归过滤
    -A        #显示过滤出来的内容及向下多少行
    -B        #向上
    -C        #向上向下个多少行


#过滤以什么开头的行

[root@shell /scripts/shell13]# grep '^root' passwd 
root:x:0:0:root:/root:/bin/bash

#过滤以什么为结尾的行

[root@shell /scripts/shell13]# grep 't$' passwd 
halt:x:7:0:halt:/sbin:/sbin/halt

#过滤出空行,并打印行号

[root@shell /scripts/shell13]# grep -n '^$'  passwd 
9:
14:

#匹配任意一个字符,不匹配空行

[root@shell /scripts/shell13]# grep '.' passwd 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

#匹配所有的行,包括空行

[root@shell /scripts/shell13]# grep '.*' passwd 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

#取消特殊含义,只过滤以点为结尾的行
[root@shell /scripts/shell13]# grep '\.$' passwd 
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin.

#匹配中括号中的任意一个字符

[root@shell /scripts/shell13]# grep '^[ac]' passwd 
adm:x:3:4:adm:/var/adm:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
aaaa:x:1014:1014::/home/aaaa:/bin/bash
abbb:x:1015:1015::/home/abbb:/bin/bash
accc:x:1016:1016::/home/accc:/bin/bash
addd:x:1017:1017::/home/addd:/bin/bash
acc:x:1018:1018::/home/acc:/bin/bash
abb:x:1019:1019::/home/abb:/bin/bash
add:x:1020:1020::/home/add:/bin/bash
aee:x:1021:1021::/home/aee:/bin/bash
caa:x:1025:1025::/home/caa:/bin/bash
cbb:x:1026:1026::/home/cbb:/bin/bash
cdd:x:1027:1027::/home/cdd:/bin/bash
cee:x:1028:1028::/home/cee:/bin/bash

#过滤出以ac开头的行
[root@shell /scripts/shell13]# grep -E '^(ac)' passwd 
accc:x:1016:1016::/home/accc:/bin/bash
acc:x:1018:1018::/home/acc:/bin/bash

[root@shell /scripts/shell13]# grep -E '^ac' passwd 
accc:x:1016:1016::/home/accc:/bin/bash
acc:x:1018:1018::/home/acc:/bin/bash

#排除中括号中的任意字符
[root@shell /scripts/shell13]# grep  '^[^ac]' passwd 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin

#统计出文件中所有字母出现的次数,次数从大到小进行排列

[root@shell /scripts/shell13]# grep -o '[a-Z]'  passwd |sort  |uniq  -c | sort -rn
    145 b
    138 n
    121 o
    119 a
    110 s
    105 i
     86 e
     69 h
     61 x

#统计出文件中所有单词出现的次数,次数从大到小进行排列

[root@shell /scripts/shell13]# grep -Eo '[a-Z]+'  passwd |sort  |uniq  -c | sort -rn
     55 x
     34 bin
     30 bash
     29 home
     28 sbin
     22 nologin
     11 var
      5 lib
      4 User

[root@shell /scripts/shell13]# grep -o '[a-Z]*'  passwd |sort  |uniq  -c | sort -rn
     55 x
     34 bin
     30 bash
     29 home
     28 sbin
     22 nologin

#+和*的区别之处
[root@shell /scripts/shell13]# grep  'a*' passwd 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt

mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

[root@shell /scripts/shell13]# grep -E 'a+' passwd 
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin.

#*和?的区别
[root@shell /scripts/shell13]# grep -Eo  'a*'  passwd 
a
a
aaa
a
a
a
a
aaaa
aaaa
a
a
[root@shell /scripts/shell13]# grep -Eo  'a?'  passwd 
a
a
a
a
a
a
a
a
a

#过滤出passwd文件中数字为两位或者3位的数字


[root@shell /scripts/shell13]# grep -Ew  '[0-9]{2,3}' passwd 
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin.
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin

#匹配数字位数出现两次
[root@shell /scripts/shell13]# grep -Ew  '[0-9]{2}' passwd 
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin.
nobody:x:99:99:Nobody:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
mysql:x:27:27:MariaDB Server:/var/lib/mysql:/sbin/nologin

#匹配数字出现5次以上
[root@shell /scripts/shell13]# grep -Ew  '[0-9]{5,}' passwd 
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin

#匹配数字至少1次,最多2次
[root@shell /scripts/shell13]# grep -Ew  '[0-9]{1,2}' passwd 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin

#前面的数字最多匹配2次,可以匹配0次
[root@shell /scripts/shell13]# grep -Ew  '[0-9]{,2}' passwd 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt

mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

[root@shell /scripts/shell13]# grep -Ew  '[0-9]{0,2}' passwd 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt

mail:x:8:12:mail:/var/spool/mail:/sbin/nologin


#过滤文件中以r开头的行,忽略大小写


[root@shell /scripts/shell13]# grep -i '^r' passwd 
root:x:0:0:root:/root:/bin/bash
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
rtoo:x:1003:1003::/home/rtoo:/bin/bash
ROOT

[root@shell /scripts/shell13]# grep '^[rR]' passwd 
root:x:0:0:root:/root:/bin/bash
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
rtoo:x:1003:1003::/home/rtoo:/bin/bash
ROOT

[root@shell /scripts/shell13]# grep -E '^(r|R)'  passwd 
root:x:0:0:root:/root:/bin/bash
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
rtoo:x:1003:1003::/home/rtoo:/bin/bash
ROOT

#过滤出文件中包含root  nginx  mysql  www 等字符串

[root@shell /scripts/shell13]# grep -E  'root|nginx|mysql|www' passwd 
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
www:x:1000:1000::/home/www:/bin/bash
mysql:x:27:27:MariaDB Server:/var/lib/mysql:/sbin/nologin
nginx:x:998:996:Nginx web server:/var/lib/nginx:/sbin/nologin

#过滤出文件中以root  nginx  mysql  www 开头的行

[root@shell /scripts/shell13]# grep -E  '^root|^nginx|^mysql|^www' passwd 
root:x:0:0:root:/root:/bin/bash
www:x:1000:1000::/home/www:/bin/bash
mysql:x:27:27:MariaDB Server:/var/lib/mysql:/sbin/nologin
nginx:x:998:996:Nginx web server:/var/lib/nginx:/sbin/nologin
[root@shell /scripts/shell13]# grep -E '^(root|nginx|mysql|www)' passwd
root:x:0:0:root:/root:/bin/bash
www:x:1000:1000::/home/www:/bin/bash
mysql:x:27:27:MariaDB Server:/var/lib/mysql:/sbin/nologin
nginx:x:998:996:Nginx web server:/var/lib/nginx:/sbin/nologin


#取IP地址

[root@shell /scripts/shell13]# ifconfig  | grep -E  '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' -o
10.0.0.170
255.255.255.0
10.0.0.255
172.16.1.170
255.255.255.0
172.16.1.255
127.0.0.1
255.0.0.0

[root@shell /scripts/shell13]# cat id.txt
a 123241423543345433
b 123241C23543345433
c 12324142354334543X
d 12324142X543345433
e 1232414235433454333
a B23241423543345433
[root@shell /scripts/shell13]# grep -E '[0-9X]{18}' id.txt 
a 123241423543345433
c 12324142354334543X
d 12324142X543345433
e 1232414235433454333
[root@shell /scripts/shell13]# grep -E '[0-9]{17}[0-9X]{1}' id.txt 
a 123241423543345433
c 12324142354334543X
e 1232414235433454333
[root@shell /scripts/shell13]# grep -Ew '[0-9]{17}[0-9X]{1}' id.txt 
a 123241423543345433
c 12324142354334543X

2. Shell正则之Sed

三剑客的老二   擅长替换

流编辑器  非交互式的编辑器。  

Sed的工作原理

sed命令按照行进行处理内容。处理文件时,首先会将第一行取出放在一个缓冲区中,这个缓冲区我们称之为模式空间。

sed进行处理。如果行匹配处理完成之后将之输出到屏幕,如果行不匹配,将之丢弃。接着处理下一行。同样的操作,知道文件结束。文件的内容其实并没有改变。如果想真正的改变,需要加上-i选项。

sed是可以同时处理多个文件的。

sed的语法:

sed  [选项]  command  files


sed正则使用,跟grep相差不大

sed 使用扩展正则时, 需要使用-r选项

Sed的命令示例:

选项:    增删改查

    -n        #取消默认输出
    -i        #修改文件内容
    -r        #支持扩展正则
    -e        #多项编辑

Sed 的内部命令

    a        #追加
    i        #插入
    p        #打印
    d        #删除
    s        #替换
    g        #全局
    c        #在当前行位置进行替换#取反
    =        #显示行号
    w        #写文件命令
    i        #忽略大小写

了解
    n        #读入下一行,从下一条命令进行处理
    h        #把模式空间里的内容重定向到暂存缓冲区    
    H        #把模式空间里的内容追加到暂存缓冲区    
    g        #取出暂存缓冲区的内容,将其复制到模式空间,覆盖原处的内容
    G        #取出暂存缓冲区的内容,将其复制到模式空间,追加到原处的内容的后面


实例:

#    -e     多项编辑   #了解

[root@shell /scripts/shell13]# sed '1,20d' passwd | sed 's#home#oldboy#g'

[root@shell /scripts/shell13]# sed -e '1,20d' -e 's#home#oldboy#g' passwd

#    打印命令p

[root@shell /scripts/shell13]# sed -n '1p' passwd 
root:x:0:0:root:/root:/bin/bash
[root@shell /scripts/shell13]# sed -n '1,3p' passwd 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@shell /scripts/shell13]# sed -n '1p;3p' passwd 
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@shell /scripts/shell13]# sed -n '$p' passwd 
ROOT
[root@shell /scripts/shell13]# sed -n '/root/p' passwd 
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin


#追加命令a

[root@shell /scripts/shell13]# sed '1aoldboy' passwd 
root:x:0:0:root:/root:/bin/bash
oldboy

[root@shell /scripts/shell13]# sed '1aoldboy\noldgirl' passwd 
root:x:0:0:root:/root:/bin/bash
oldboy
oldgirl
bin:x:1:1:bin:/bin:/sbin/nologin

[root@shell /scripts/shell13]# sed '$aoldboy' passwd

#插入命令i

[root@shell /scripts/shell13]# sed '1ioldboy' passwd 
oldboy

#删除命令d

[root@shell /scripts/shell13]# sed '1d' passwd 
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

[root@shell /scripts/shell13]# sed '$d' passwd

[root@shell /scripts/shell13]# sed -i '$d' passwd 

[root@shell /scripts/shell13]# sed  '/root/d' passwd 
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin


#修改命令c

[root@shell /scripts/shell13]# sed '9coldboy'  passwd 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
oldboy
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

[root@shell /scripts/shell13]# sed '1c oldboy'  passwd 
oldboy
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

[root@shell /scripts/shell13]# sed '/^halt/coldboy' passwd 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
oldboy

[root@shell /scripts/shell13]# sed '7cSELINUX=enforcing' /etc/selinux/config

[root@shell /scripts/shell13]# sed '/^SELINUX=/cSELINUX=enforcing' /etc/selinux/config

#写入文件命令w

[root@shell /scripts/shell13]# sed -n '/root/p' passwd 
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@shell /scripts/shell13]# sed -n '/root/wnewfile.txt' passwd 
[root@shell /scripts/shell13]# ll newfile.txt 
-rw-r--r-- 1 root root 77 2020-03-06 15:15 newfile.txt
[root@shell /scripts/shell13]# cat newfile.txt
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@shell /scripts/shell13]# sed -n '2w newfile-2.txt' passwd 
[root@shell /scripts/shell13]# cat newfile-2.txt 
bin:x:1:1:bin:/bin:/sbin/nologin

[root@shell /scripts/shell13]# sed -n '2w /tmp/newfile-2.txt' passwd 
[root@shell /scripts/shell13]# ll /tmp/
total 16
-rw-r--r-- 1 root root  50 2020-03-04 09:55 ip.log
-rw-r--r-- 1 root root  33 2020-03-06 15:17 newfile-2.txt

#取反命令!

[root@shell /scripts/shell13]# sed '3!d' passwd 
daemon:x:2:2:daemon:/sbin:/sbin/nologin

#显示行号的命令 =

[root@shell /scripts/shell13]# sed = passwd 
1
root:x:0:0:root:/root:/bin/bash
2
bin:x:1:1:bin:/bin:/sbin/nologin
3
daemon:x:2:2:daemon:/sbin:/sbin/nologin

#替换

s g  i

#替换文件中每一行的第一个满足的条件
[root@shell /scripts/shell13]# sed 's#root#oldboy#'  passwd
oldboy:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin

#替换文件中每一行的第一个满足的条件,并且是以root开头的
[root@shell /scripts/shell13]# sed 's#^root#oldboy#'  passwd
oldboy:x:0:0:root:/root:/bin/bash

#全局替换
[root@shell /scripts/shell13]# sed 's#root#oldboy#g'  passwd
oldboy:x:0:0:oldboy:/oldboy:/bin/bash

#指定行进行替换
[root@shell /scripts/shell13]# sed '11s#root#oldboy#g' passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin

#多行替换
[root@shell /scripts/shell13]# sed '1,11s#root#oldboy#g' passwd


#替换的时候忽略大小写
[root@shell /scripts/shell13]# sed 's#root#oldboy#gi' passwd 
oldboy:x:0:0:oldboy:/oldboy:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt

mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/oldboy:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
dcc:x:1024:1024::/home/dcc:/bin/bash
caa:x:1025:1025::/home/caa:/bin/bash
cbb:x:1026:1026::/home/cbb:/bin/bash
cdd:x:1027:1027::/home/cdd:/bin/bash
cee:x:1028:1028::/home/cee:/bin/bash
halt  sbin
oldboy halt  sbin
oldboy

#在指定的字符串后面加入内容
[root@shell /scripts/shell13]# sed  's/root/&TEST/g' passwd 
rootTEST:x:0:0:rootTEST:/rootTEST:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

#给每一行加上注释信息
[root@shell /scripts/shell13]# sed  's/^/&#/g' passwd 
#root:x:0:0:root:/root:/bin/bash
#bin:x:1:1:bin:/bin:/sbin/nologin
#daemon:x:2:2:daemon:/sbin:/sbin/nologin
#adm:x:3:4:adm:/var/adm:/sbin/nologin
#lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin


[root@shell /scripts/shell13]# sed 's/\/bin\/bash/oldboy/g' passwd

[root@shell /scripts/shell13]# sed 's#/bin/bash#oldboy#g' passwd 

#后向引用

[root@shell /scripts/shell13]# ifconfig  eth0 | sed  -rn  '2s#.*t (.*)  n.*#\1#gp'
10.0.0.170

[root@shell /scripts/shell13]# sed -r 's#(.*)(:.*:)(.*)#\3\2\1#g' passwd 
/bin/bash:/root:root:x:0:0:root
/sbin/nologin:/bin:bin:x:1:1:bin
/sbin/nologin:/sbin:daemon:x:2:2:daemon
/sbin/nologin:/var/adm:adm:x:3:4:adm
/sbin/nologin:/var/spool/lpd:lp:x:4:7:lp


#给文件加上注释

[root@shell /scripts/shell13]# sed 's/^/#/g' passwd 
#root:x:0:0:root:/root:/bin/bash
#bin:x:1:1:bin:/bin:/sbin/nologin
#daemon:x:2:2:daemon:/sbin:/sbin/nologin
#adm:x:3:4:adm:/var/adm:/sbin/nologin
#lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
#sync:x:5:0:sync:/sbin:/bin/sync

[root@shell /scripts/shell13]# sed '1,5s/^/#/g' passwd 
#root:x:0:0:root:/root:/bin/bash
#bin:x:1:1:bin:/bin:/sbin/nologin
#daemon:x:2:2:daemon:/sbin:/sbin/nologin
#adm:x:3:4:adm:/var/adm:/sbin/nologin
#lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

[root@shell /scripts/shell13]# sed '1,5s/.*/#&/g' passwd 
#root:x:0:0:root:/root:/bin/bash
#bin:x:1:1:bin:/bin:/sbin/nologin
#daemon:x:2:2:daemon:/sbin:/sbin/nologin
#adm:x:3:4:adm:/var/adm:/sbin/nologin
#lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown


[root@shell /scripts/shell13]# sed 's/.*/#&/g' passwd 
#root:x:0:0:root:/root:/bin/bash
#bin:x:1:1:bin:/bin:/sbin/nologin
#daemon:x:2:2:daemon:/sbin:/sbin/nologin
#adm:x:3:4:adm:/var/adm:/sbin/nologin
#lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
#sync:x:5:0:sync:/sbin:/bin/sync
#shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
#halt:x:7:0:halt:/sbin:/sbin/halt
##mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
#operator:x:11:0:operator:/root:/sbin/nologin
###games:x:12:100:games:/usr/games:/sbin/nologin
# #dcc:x:1024:1024::/home/dcc:/bin/bash
#    #caa:x:1025:1025::/home/caa:/bin/bash
#cbb:x:1026:1026::/home/cbb:/bin/bash
#    ##cdd:x:1027:1027::/home/cdd:/bin/bash
#cee:x:1028:1028::/home/cee:/bin/bash
[root@shell /scripts/shell13]# sed  's/^#*/#/g' passwd 
#root:x:0:0:root:/root:/bin/bash
#bin:x:1:1:bin:/bin:/sbin/nologin
#daemon:x:2:2:daemon:/sbin:/sbin/nologin
#adm:x:3:4:adm:/var/adm:/sbin/nologin
#lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
#sync:x:5:0:sync:/sbin:/bin/sync
#shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
#halt:x:7:0:halt:/sbin:/sbin/halt
#mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
#operator:x:11:0:operator:/root:/sbin/nologin
#games:x:12:100:games:/usr/games:/sbin/nologin
# #dcc:x:1024:1024::/home/dcc:/bin/bash
#    #caa:x:1025:1025::/home/caa:/bin/bash
#cbb:x:1026:1026::/home/cbb:/bin/bash
#    ##cdd:x:1027:1027::/home/cdd:/bin/bash
#cee:x:1028:1028::/home/cee:/bin/bash

[root@shell /scripts/shell13]# sed 's/^[ \t]*#*/#/g' passwd 
#root:x:0:0:root:/root:/bin/bash
#bin:x:1:1:bin:/bin:/sbin/nologin
#daemon:x:2:2:daemon:/sbin:/sbin/nologin
#adm:x:3:4:adm:/var/adm:/sbin/nologin
#lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
#sync:x:5:0:sync:/sbin:/bin/sync
#shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
#halt:x:7:0:halt:/sbin:/sbin/halt
#mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
#operator:x:11:0:operator:/root:/sbin/nologin
#games:x:12:100:games:/usr/games:/sbin/nologin
#dcc:x:1024:1024::/home/dcc:/bin/bash
#caa:x:1025:1025::/home/caa:/bin/bash
#cbb:x:1026:1026::/home/cbb:/bin/bash
#cdd:x:1027:1027::/home/cdd:/bin/bash
#cee:x:1028:1028::/home/cee:/bin/bash

[root@shell /scripts/shell13]# sed 's/^[ \t]*#*/#/g' passwd 
#root:x:0:0:root:/root:/bin/bash
#bin:x:1:1:bin:/bin:/sbin/nologin
#daemon:x:2:2:daemon:/sbin:/sbin/nologin
#adm:x:3:4:adm:/var/adm:/sbin/nologin
#lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
#sync:x:5:0:sync:/sbin:/bin/sync
#    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
#halt:x:7:0:halt:/sbin:/sbin/halt
#mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
#operator:x:11:0:operator:/root:/sbin/nologin
#games:x:12:100:games:/usr/games:/sbin/nologin
#dcc:x:1024:1024::/home/dcc:/bin/bash
#caa:x:1025:1025::/home/caa:/bin/bash
#cbb:x:1026:1026::/home/cbb:/bin/bash
#cdd:x:1027:1027::/home/cdd:/bin/bash
#cee:x:1028:1028::/home/cee:/bin/bash
[root@shell /scripts/shell13]# sed 's/^[ \t#]*/#/g' passwd 
#root:x:0:0:root:/root:/bin/bash
#bin:x:1:1:bin:/bin:/sbin/nologin
#daemon:x:2:2:daemon:/sbin:/sbin/nologin
#adm:x:3:4:adm:/var/adm:/sbin/nologin
#lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
#sync:x:5:0:sync:/sbin:/bin/sync
#shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
#halt:x:7:0:halt:/sbin:/sbin/halt
#mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
#operator:x:11:0:operator:/root:/sbin/nologin
#games:x:12:100:games:/usr/games:/sbin/nologin
#dcc:x:1024:1024::/home/dcc:/bin/bash
#caa:x:1025:1025::/home/caa:/bin/bash
#cbb:x:1026:1026::/home/cbb:/bin/bash
#cdd:x:1027:1027::/home/cdd:/bin/bash
#cee:x:1028:1028::/home/cee:/bin/bash

#删除注释

[root@shell /scripts/shell13]# cat passwd
#root:x:0:0:root:/root:/bin/bash
##bin:x:1:1:bin:/bin:/sbin/nologin
##daemon:x:2:2:daemon:/sbin:/sbin/nologin
##adm:x:3:4:adm:/var/adm:/sbin/nologin
##lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
##sync:x:5:0:sync:/sbin:/bin/sync
###    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
##halt:x:7:0:halt:/sbin:/sbin/halt
###mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
##operator:x:11:0:operator:/root:/sbin/nologin
####games:x:12:100:games:/usr/games:/sbin/nologin
 #dcc:x:1024:1024::/home/dcc:/bin/bash
    #caa:x:1025:1025::/home/caa:/bin/bash
##cbb:x:1026:1026::/home/cbb:/bin/bash
        ##cdd:x:1027:1027::/home/cdd:/bin/bash
##cee:x:1028:1028::/home/cee:/bin/bash
[root@shell /scripts/shell13]# sed '/^#/d' passwd 
 #dcc:x:1024:1024::/home/dcc:/bin/bash
    #caa:x:1025:1025::/home/caa:/bin/bash
        ##cdd:x:1027:1027::/home/cdd:/bin/bash
[root@shell /scripts/shell13]# sed '/^[ \t]*#/d' passwd 

#删除空行,空行里面有空格或者tab键
[root@shell /scripts/shell13]# sed '/^[ \t]*$/d' passwd

3. 正则表达式之Awk

什么是awk

awk是一个编程语言

主要作用:对文本和数据的处理

awk处理数据的流程

1. 扫描文件内容,从上到下进行扫描,按照行进行处理的。

2. 寻找匹配到的内容,进行读取到特定的模式中,进行行处理

3. 行满足指定模式动作,则输出到屏幕上面,不满足丢弃

4. 接着读取下一行继续处理,接着循环,直到文件的结尾

awk语法格式

awk [选项]  command   files

三种格式

行处理前        行处理中          行处理后

BEGIN          执行的命令        最后的显示  END

#行处理前
[root@shell ~]# awk  'BEGIN{print  1 + 1}'
2

#行处理前+行处理后
[root@shell ~]# awk -F: '{print $1}'  /etc/passwd
root
bin
daemon

[root@shell ~]# awk 'BEGIN{FS=":"}{print $1}'  /etc/passwd
root
bin
daemon
adm

[root@shell ~]# awk 'BEGIN{FS=":";OFS="###"}{print $1,$2}'  /etc/passwd
root###x
bin###x
daemon###x
adm###x

#行处理前+行处理中+行处理后

[root@shell ~]# awk 'BEGIN{FS=":";OFS="###"}{print $1,$2}END{print "内容打印结束"}'  /etc/passwd
root###x
bin###x
daemon###x
adm###x
lp###x
sync###x
shutdown###x
halt###x
mail###x
operator###x
games###x
内容打印结束

[root@shell ~]# awk  'BEGIN{print 1+1}{print "OK"}END{print "内容显示结束"}'  /etc/hosts
2
OK
OK
内容显示结束

[root@shell ~]# cat test.txt
10 10 10
[root@shell ~]# awk '{print $1+$2}' test.txt
20


[root@shell ~]# awk -F: '{print $1,$3}' /etc/passwd
root 0
bin 1
daemon 2


awk的工作原理

1. awk将文件中每一行作为输入,将每一行的数据赋值给内部变量 $0 

2. awk有开始进行字段分解,根据指定的分隔符,将每个字段进行赋值给内部变量 $1 $2 $3 

3. awk默认的分割为空白字符,由内部变量FS来确定,也可以使用-F进行指定对应的分隔符

4. awk处理时使用print进行打印你分割后的字段

5. awk打印输出结果之后,不同字段之间由空格进行分割,这个空格是由不同字段之间的逗号进行映射的,由内部变量OFS进行修改, OFS默认的输出分割符就是空格

6. awk输出一行内容之后,从新读取下一行内容,会覆盖内部变量$0,然后新的字符进行字段分割并进行处理。

#awk的命令格式


    匹配  模式  动作  

#匹配    模式
[root@shell ~]# awk   '/root/' passwd 
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

#动作
[root@shell ~]# awk   '{print $1}' passwd  
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

#模式+动作

[root@shell ~]# awk  -F:  '/root/{print $1}' passwd  
root
operator

#当根分区的使用率大于多少时则打印第四列
[root@shell ~]# df  | awk  '/\/$/{print $4}'
48018556
[root@shell ~]# df  | awk  '/\/$/{ if ($3>2100000) print $4}'
[root@shell ~]# df  | awk  '/\/$/{ if ($3>2000000) print $4}'
48018556

4. Awk的内部变量

1. 输入分割符

FS   输入分隔符  默认以空白字符为分隔符

[root@shell ~]# awk  -F: '{print $1}' passwd 
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
[root@shell ~]# awk 'BEGIN{FS=":"}{print $1}' passwd
root
bin
daemon
adm
lp
sync
shutdown
halt
mail

[root@shell ~]# awk -F '[ :]' '{print $3}'  passwd 
0
1
2
3
4
5
6
7
8

[root@shell ~]# awk -F '[ /]*' 'NR==3{print $3}'  test.txt 
10.0.0.170
[root@shell ~]# cat test.txt
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:c5:ab:bf brd ff:ff:ff:ff:ff:ff
 /   inet 10.0.0.170/24 brd 10.0.0.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fec5:abbf/64 scope link 
       valid_lft forever preferred_lft forever

2. 输出分隔符

OFS   默认输出分割为空格,  打印的时候用逗号作为分割,逗号就是输出分割符,在显示的时候,默认映射为空格。

[root@shell ~]# awk -F: '{print $1,$2}' passwd 
root x 0
bin x 1
daemon x
adm x
lp x
sync x
shutdown x
halt x
mail x
[root@shell ~]# awk -F: '{print $1$2}' passwd 
rootx 0
binx 1
daemonx
admx
lpx
syncx
shutdownx
haltx
mailx
[root@shell ~]# awk -F: '{print $1" "$2}' passwd 
root x 0
bin x 1
daemon x
adm x
lp x
sync x
shutdown x
halt x
mail x
[root@shell ~]# awk -F: -vOFS="@" '{print $1,$2}' passwd 
root@x 0
bin@x 1
daemon@x
adm@x
lp@x
sync@x
shutdown@x
halt@x
mail@x
[root@shell ~]# awk -F:  'BEGIN{OFS="$"}{print $1,$2}' passwd 
root$x 0
bin$x 1
daemon$x
adm$x
lp$x
sync$x
shutdown$x
halt$x
mail$x

3. 内部变量NF  最后一列

NF  表示每一行最后一列   $NF  打印最后一列的内容

[root@shell ~]# awk -F: '{print $NF}' passwd 
/bin/bash
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/bin/sync
/sbin/shutdown
/sbin/halt
/sbin/nologin
[root@shell ~]# awk -F: '{print NF}' passwd 
6
6
7
7
7
7
7
7
7

[root@shell ~]# awk -F: '{print $7}' passwd 


/sbin/nologin
/sbin/nologin
/sbin/nologin
/bin/sync
/sbin/shutdown
/sbin/halt
/sbin/nologin
[root@shell ~]# awk -F: '{print $NF}' passwd 
/bin/bash
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/bin/sync
/sbin/shutdown
/sbin/halt
/sbin/nologin

4. 内部变量$0 

$0  表示整行内容

[root@shell ~]# awk '{print $0}' passwd 
root:x 0:100:root:/root:/bin/bash
bin:x 1:200:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
[root@shell ~]# awk 'NR==1{print $0}' passwd 
root:x 0:100:root:/root:/bin/bash

5. 内部变量NR  

NR  表示是行号      $NR

[root@shell ~]# awk '{print NR,$0}' passwd 
1 root:x 0:100:root:/root:/bin/bash
2 bin:x 1:200:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8 halt:x:7:0:halt:/sbin:/sbin/halt
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
[root@shell ~]# awk 'NR==1' passwd 
root:x 0:100:root:/root:/bin/bash
[root@shell ~]# awk 'NR==1{print $0}' passwd 
root:x 0:100:root:/root:/bin/bash

#$NR不可用的
[root@shell ~]# awk '{print $NR,$0}' passwd 
root:x root:x 0:100:root:/root:/bin/bash
1:200:bin:/bin:/sbin/nologin bin:x 1:200:bin:/bin:/sbin/nologin
 daemon:x:2:2:daemon:/sbin:/sbin/nologin
 adm:x:3:4:adm:/var/adm:/sbin/nologin
 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
 sync:x:5:0:sync:/sbin:/bin/sync
 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
 halt:x:7:0:halt:/sbin:/sbin/halt
 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

6. 内部变量 FNR 

FNR  显示行号,针对对个文件时进行处理
    不同的文件显示各自的行号

[root@shell ~]# awk '{print NR,$0}'  passwd  test.txt 
1 root:x 0:100:root:/root:/bin/bash
2 bin:x 1:200:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8 halt:x:7:0:halt:/sbin:/sbin/halt
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
11     link/ether 00:0c:29:c5:ab:bf brd ff:ff:ff:ff:ff:ff
12  /   inet 10.0.0.170/24 brd 10.0.0.255 scope global eth0
13        valid_lft forever preferred_lft forever
14     inet6 fe80::20c:29ff:fec5:abbf/64 scope link 
15        valid_lft forever preferred_lft forever
[root@shell ~]# awk '{print FNR,$0}'  passwd  test.txt 
1 root:x 0:100:root:/root:/bin/bash
2 bin:x 1:200:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8 halt:x:7:0:halt:/sbin:/sbin/halt
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
1 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
2     link/ether 00:0c:29:c5:ab:bf brd ff:ff:ff:ff:ff:ff
3  /   inet 10.0.0.170/24 brd 10.0.0.255 scope global eth0
4        valid_lft forever preferred_lft forever
5     inet6 fe80::20c:29ff:fec5:abbf/64 scope link 
6        valid_lft forever preferred_lft forever

了解 

#7. RS 输入记录分隔符   ORS   输出记录分隔符

8. awk格式化输出

[root@shell ~]# date
Mon Mar  9 10:58:52 CST 2020
[root@shell ~]# date | awk '{print "今年是:"$NF"年","今月为:"$2"月"}'
今年是:2020年 今月为:Mar月

[root@shell ~]# awk -F:  '{print "用户为:"$1,"UID为:"$3,"GID为:"$4}'    /etc/passwd 
用户为:root UID为:0 GID为:0
用户为:bin UID为:1 GID为:1
用户为:daemon UID为:2 GID为:2
用户为:adm UID为:3 GID为:4
用户为:lp UID为:4 GID为:7
用户为:sync UID为:5 GID为:0

printf 函数输出  了解

[root@shell ~]# awk -F:  '{printf "%-20s %-10s %-10s\n",  "用户为:"$1,"UID为:"$3,"GID为:"$4}'    /etc/passwd 
用户为:root             UID为:0     GID为:0    
用户为:bin              UID为:1     GID为:1    
用户为:daemon           UID为:2     GID为:2    
用户为:adm              UID为:3     GID为:4    
用户为:lp               UID为:4     GID为:7    
用户为:sync             UID为:5     GID为:0    
用户为:shutdown         UID为:6     GID为:0    
用户为:halt             UID为:7     GID为:0    
用户为:mail             UID为:8     GID为:12

5. Awk模式动作

1. 正则表达式

[root@shell ~]# awk '/^root/' /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root@shell ~]# awk '$0 ~/^root/'  /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root@shell ~]# vim passwd 
[root@shell ~]# cat passwd
root:x:0:100:root:/root:/bin/bash
bin:x:1:root:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
[root@shell ~]# awk '$0 ~/^root/'  passwd
root:x:0:100:root:/root:/bin/bash
[root@shell ~]# awk  -F: '$4 ~/^root/'  passwd
bin:x:1:root:bin:/bin:/sbin/nologin

[root@shell ~]# awk '!/^root/' passwd 
bin:x:1:root:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
[root@shell ~]# awk '$0 !~/^root/' passwd 
bin:x:1:root:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
[root@shell ~]# awk -F: '$4 !~/^root/' passwd 
root:x:0:100:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

2. 比较表达式

关系运算符

<        小于
<=        小于等于
==        等于
>        大于
>=        大于等于
!=        不等于

x<y

[root@shell ~]# awk -F: '$3 == 0'  passwd 
root:x:0:100:root:/root:/bin/bash
[root@shell ~]# awk -F: '$3==0'  passwd 
root:x:0:100:root:/root:/bin/bash
[root@shell ~]# awk -F: '$3==0{print $0}'  passwd 
root:x:0:100:root:/root:/bin/bash
[root@shell ~]# awk -F: '$3<5' passwd 
root:x:0:100:root:/root:/bin/bash
bin:x:1:root:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@shell ~]# awk -F: '$3<5{print $0}' passwd 
root:x:0:100:root:/root:/bin/bash
bin:x:1:root:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@shell ~]# awk -F: '$3>5{print $0}' passwd 
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

[root@shell ~]# awk -F: '$3>=5{print $0}' passwd 
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
[root@shell ~]# awk -F: '$3<=5{print $0}' passwd 
root:x:0:100:root:/root:/bin/bash
bin:x:1:root:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync

[root@shell ~]# awk -F: '$1 == "root"' passwd 
root:x:0:100:root:/root:/bin/bash
[root@shell ~]# awk -F: '$4 == "root"' passwd 
bin:x:1:root:bin:/bin:/sbin/nologin
[root@shell ~]# awk -F: '$4 != "root"' passwd 
root:x:0:100:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

[root@shell ~]# df | awk '/\/$/'
/dev/sda3       50101352 2082836  48018516   5% /
[root@shell ~]# df | awk '/\/$/' | awk '$3 > 2100000{print $4}'
[root@shell ~]# df | awk '/\/$/' | awk '$3 > 2000000{print $4}'
48018516
[root@shell ~]# df | awk '/\/$/{if($3>2000000)print $4}'
48018516

3. 条件表达式

[root@shell ~]# awk -F: '{if($3>20000)print $0}' /etc/passwd
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
[root@shell ~]# awk -F: '{if($3>1000){print $NF} else {print $1}}' /etc/passwd
root
nc
shutdown
halt
mail
operator
games
ftp
nobody
systemd-network
dbus
polkitd
tss
abrt
sshd
postfix
rpc
rpcuser
/sbin/nologin
ntp
www
/bin/bash
mysql
/bin/bash
/bin/bash
/bin/bash
nginx
/bin/bash

4. 运算表达式

[root@shell ~]# awk -F: '$3 * 100 > 50000 ' /etc/passwd
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
www:x:1000:1000::/home/www:/bin/bash
user:x:1001:1001::/home/user:/bin/bash
test:x:1002:1002::/home/test:/bin/bash
rtoo:x:1003:1003::/home/rtoo:/bin/bash
abc1:x:1004:1004::/home/abc1:/bin/bash

[root@shell ~]# awk -F: '{if($3*10>1000){print $NF} else {print $3}}' /etc/passwd
0
1
2
3
4
5
6
7
8
11
12
14
99
/sbin/nologin
81
/sbin/nologin

[root@shell ~]# awk -F: '/sync/{print $3}' passwd 
5
[root@shell ~]# awk -F: '/sync/{print $3 + 10}' passwd 
15
[root@shell ~]# awk -F: '/sync/{print $3 -2}' passwd 
3
[root@shell ~]# awk -F: '/sync/{print $3*2}' passwd 
10
[root@shell ~]# awk -F: '/sync/{print $3/5}' passwd 
1
[root@shell ~]# awk -F: '/sync/{print $3^5}' passwd 
3125
[root@shell ~]# awk -F: '/sync/{print $3%5}' passwd 
0

[root@shell ~]# awk -F: '/sync/{print $3+$4}' passwd 
5
[root@shell ~]# awk -F: '/sync/{print $3,$4}' passwd 
5 0
[root@shell ~]# awk -F: '/sync/{print $3+$4}' passwd 
5
[root@shell ~]# awk -F: '/sync/{print $3-$4}' passwd 
5
[root@shell ~]# awk -F: '/sync/{print $3*$4}' passwd 
0
[root@shell ~]# awk -F: '/sync/{print $3/$4}' passwd 
awk: cmd. line:1: (FILENAME=passwd FNR=6) fatal: division by zero attempted
[root@shell ~]# awk -F: '/sync/{print $3\/$4}' passwd 
awk: cmd. line:1: /sync/{print $3\/$4}
awk: cmd. line:1:                ^ backslash not last character on line
awk: cmd. line:1: /sync/{print $3\/$4}
awk: cmd. line:1:                ^ syntax error
[root@shell ~]# awk -F: '/sync/{print $3%$4}' passwd 
awk: cmd. line:1: (FILENAME=passwd FNR=6) fatal: division by zero attempted in `%'
[root@shell ~]# awk -F: '/sync/{print $3^$4}' passwd 
1
[root@shell ~]# awk -F: 'BEGIN{print 5/0}' 
awk: cmd. line:1: fatal: division by zero attempted
[root@shell ~]# awk -F: 'BEGIN{print 5%0}' 
awk: cmd. line:1: fatal: division by zero attempted in `%'
[root@shell ~]# 

5. 逻辑操作符

&&  并且

||  或者

!  非

[root@shell ~]# awk 'NR>2 && NR<4' passwd 
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@shell ~]# awk 'NR>2 || NR<4' passwd 
root:x:0:100:root:/root:/bin/bash
bin:x:1:root:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
[root@shell ~]# awk 'NR>2 || NR<1' passwd 
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
[root@shell ~]# awk 'NR!=1' passwd 
bin:x:1:root:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

[root@shell ~]# awk -F: '$1 ~/root/ && $3 > 10'  passwd 
root:x:40:7:lp:/var/spool/lpd:/sbin/nologin
[root@shell ~]# awk -F: '$1 ~/root/ || $3 > 10'  passwd 
root:x:0:100:root:/root:/bin/bash
root:x:40:7:lp:/var/spool/lpd:/sbin/nologin

[root@shell ~]# awk '!/^root/' passwd 
bin:x:1:root:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

练习题

作业:

解释一下命令的含义

# awk '/west/' datafile 
# awk '/^north/' datafile 
# awk '$3 ~ /^north/' datafile 
# awk '/^(no|so)/' datafile 
# awk '{print $3,$2}' datafile
# awk '{print $3 $2}' datafile 
# awk '{print $0}' datafile 
# awk '{print "Number of fields: "NF}' datafile 
# awk '/northeast/{print $3,$2}' datafile
# awk '/^[ns]/{print $1}' datafile 
# awk '$5 ~ /\. [7-9]+/' datafile 
# awk '$2 !~ /E/{print $1,$2}' datafile 
# awk '$3 ~ /^Joel/{print $3 "is a nice boy."}' datafile 
# awk '$8 ~ /[0-9][0-9]$/{print $8}' datafile
# awk '$4 ~ /Chin$/{print "The price is $" $8 "."}' datafile 
# awk '/Tj/{print $0}' datafile 
# awk -F: '{print "Number of fields: "NF}' /etc/passwd 
# awk -F"[ :]" '{print NF}' /etc/passwd

6. Awk判断语句

if

#1.打印系统管理员用户的数量

[root@shell ~]# awk -F: '$3==0' /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root@shell ~]# awk -F: '$3==0' /etc/passwd | wc -l
1
[root@shell ~]# awk -F: '{if($3==0){i++}}END{print "当前系统管理员用户的数量为:"i}' /etc/passwd
当前系统管理员用户的数量为:1
[root@shell ~]# vim passwd 
[root@shell ~]# cat passwd
root:x:0:100:root:/root:/bin/bash
bin:x:1:root:bin:/bin:/sbin/nologin
daemon:x:0:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
root:x:0:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
[root@shell ~]# awk -F: '{if($3==0){i++}}END{print "当前系统管理员用户的数量为:"i}' passwd
当前系统管理员用户的数量为:3

#打印系统管理员的数量和其他用户的数量

if  else

[root@shell ~]# awk -F: '{if($3==0){i++}else{j++}}END{print "当前系统超级管理员用户的数量为:"i;print "当前系统其它用户数量为:"j}' /etc/passwd
当前系统超级管理员用户的数量为:1
当前系统其它用户数量为:54
[root@shell ~]# wc -l /etc/passwd
55 /etc/passwd

[root@shell ~]# awk -F: '{if($3==0){i++}else{j++}}END{print "当前系统超级管理员用户的数量为:"i,"当前系统其它用户数量为:"j}' /etc/passwd
当前系统超级管理员用户的数量为:1 当前系统其它用户数量为:54

if  else  if  else

#打印系统管理员的数量和系统用户的数量及普通用户的数量

[root@shell ~]# awk -F: '{if($3==0){a++}else{if($3>0 && $3<1000){b++}else{c++}}}END{print "管理员数量为:"a,"系统用户数量为:"b,"普通 用户数量为:"c}' /etc/passwd
管理员数量为:1 系统用户数量为:24 普通用户数量为:30

7. Awk循环语句

for

#1.创建10个用户

[root@shell ~]# awk 'BEGIN{for(a=1;a<=10;a++){print a}}'
1
2
3
4
5
6
7
8
9
10
[root@shell ~]# awk 'BEGIN{for(a=1;a<=10;a++){print "useradd  qiudao"a}}'
useradd  qiudao1
useradd  qiudao2
useradd  qiudao3
useradd  qiudao4
useradd  qiudao5
useradd  qiudao6
useradd  qiudao7
useradd  qiudao8
useradd  qiudao9
useradd  qiudao10
[root@shell ~]# awk 'BEGIN{for(a=1;a<=10;a++){print "useradd  qiudao"a}}' |bash
[root@shell ~]# tail /etc/passwd
qiudao1:x:1029:1029::/home/qiudao1:/bin/bash
qiudao2:x:1030:1030::/home/qiudao2:/bin/bash
qiudao3:x:1031:1031::/home/qiudao3:/bin/bash
qiudao4:x:1032:1032::/home/qiudao4:/bin/bash
qiudao5:x:1033:1033::/home/qiudao5:/bin/bash
qiudao6:x:1034:1034::/home/qiudao6:/bin/bash
qiudao7:x:1035:1035::/home/qiudao7:/bin/bash
qiudao8:x:1036:1036::/home/qiudao8:/bin/bash
qiudao9:x:1037:1037::/home/qiudao9:/bin/bash
qiudao10:x:1038:1038::/home/qiudao10:/bin/bash

#2.创建10个不同日期的文件

[root@shell ~]# awk 'BEGIN{for(a=1;a<11;a++){print "date -s 2020/03/"a"&>/dev/null  &&  touch `date +%F`.txt"}}'
date -s 2020/03/1&>/dev/null  &&  touch `date +%F`.txt
date -s 2020/03/2&>/dev/null  &&  touch `date +%F`.txt
date -s 2020/03/3&>/dev/null  &&  touch `date +%F`.txt
date -s 2020/03/4&>/dev/null  &&  touch `date +%F`.txt
date -s 2020/03/5&>/dev/null  &&  touch `date +%F`.txt
date -s 2020/03/6&>/dev/null  &&  touch `date +%F`.txt
date -s 2020/03/7&>/dev/null  &&  touch `date +%F`.txt
date -s 2020/03/8&>/dev/null  &&  touch `date +%F`.txt
date -s 2020/03/9&>/dev/null  &&  touch `date +%F`.txt
date -s 2020/03/10&>/dev/null  &&  touch `date +%F`.txt
[root@shell ~]# awk 'BEGIN{for(a=1;a<11;a++){print "date -s 2020/03/"a"&>/dev/null  &&  touch `date +%F`.txt"}}' |bash
[root@shell ~]# ll
total 20
-rw-r--r--  1 root root    0 2020-03-01 00:00 2020-03-01.txt
-rw-r--r--  1 root root    0 2020-03-02 00:00 2020-03-02.txt
-rw-r--r--  1 root root    0 2020-03-03 00:00 2020-03-03.txt
-rw-r--r--  1 root root    0 2020-03-04 00:00 2020-03-04.txt
-rw-r--r--  1 root root    0 2020-03-05 00:00 2020-03-05.txt
-rw-r--r--  1 root root    0 2020-03-06 00:00 2020-03-06.txt
-rw-r--r--  1 root root    0 2020-03-07 00:00 2020-03-07.txt
-rw-r--r--  1 root root    0 2020-03-08 00:00 2020-03-08.txt
-rw-r--r--  1 root root    0 2020-03-09 00:00 2020-03-09.txt
-rw-r--r--  1 root root    0 2020-03-10 00:00 2020-03-10.txt


while

#1.创建10个用户

[root@shell ~]# awk 'BEGIN{a=1;while(a<11){print a;a++}}'
1
2
3
4
5
6
7
8
9
10
[root@shell ~]# awk 'BEGIN{a=1;while(a<11){print "useradd  shanghai"a;a++}}'
useradd  shanghai1
useradd  shanghai2
useradd  shanghai3
useradd  shanghai4
useradd  shanghai5
useradd  shanghai6
useradd  shanghai7
useradd  shanghai8
useradd  shanghai9
useradd  shanghai10
[root@shell ~]# awk 'BEGIN{a=1;while(a<11){print "useradd  shanghai"a;a++}}' |bash
[root@shell ~]# tail /etc/passwd
shanghai1:x:1039:1039::/home/shanghai1:/bin/bash
shanghai2:x:1040:1040::/home/shanghai2:/bin/bash
shanghai3:x:1041:1041::/home/shanghai3:/bin/bash
shanghai4:x:1042:1042::/home/shanghai4:/bin/bash
shanghai5:x:1043:1043::/home/shanghai5:/bin/bash
shanghai6:x:1044:1044::/home/shanghai6:/bin/bash
shanghai7:x:1045:1045::/home/shanghai7:/bin/bash
shanghai8:x:1046:1046::/home/shanghai8:/bin/bash
shanghai9:x:1047:1047::/home/shanghai9:/bin/bash
shanghai10:x:1048:1048::/home/shanghai10:/bin/bash

#2.创建10个文件

[root@shell ~]# awk 'BEGIN{a=1;while(a<11){print "date -s 2020/03/"a" &>/dev/null && touch `date +%F`.log ";a++}}' |bash
[root@shell ~]# ll *.log
-rw-r--r-- 1 root root 0 2020-03-01 00:00 2020-03-01.log
-rw-r--r-- 1 root root 0 2020-03-02 00:00 2020-03-02.log
-rw-r--r-- 1 root root 0 2020-03-03 00:00 2020-03-03.log
-rw-r--r-- 1 root root 0 2020-03-04 00:00 2020-03-04.log
-rw-r--r-- 1 root root 0 2020-03-05 00:00 2020-03-05.log
-rw-r--r-- 1 root root 0 2020-03-06 00:00 2020-03-06.log
-rw-r--r-- 1 root root 0 2020-03-07 00:00 2020-03-07.log
-rw-r--r-- 1 root root 0 2020-03-08 00:00 2020-03-08.log
-rw-r--r-- 1 root root 0 2020-03-09 00:00 2020-03-09.log
-rw-r--r-- 1 root root 0 2020-03-10 00:00 2020-03-10.log

8. Awk数组

计算   求和   +=

统计   次数   ++

1. 计算数字1-100之间的和

[root@shell ~]# seq 100 |awk '{he+=$1}END{print he}'
5050

2. 计算出访问日志所有IP的响应返回的总字节数

[root@shell ~]# awk  '{zong+=$10}END{print zong}' access.log
1308567366

3. 统计出/etc/passwd文件中每个shell的数量


[root@shell ~]# awk -F: '{count[$NF]++}END{for (i in count)print i,count[i]}' /etc/passwd
/bin/sync 1
/bin/bash 50
/sbin/nologin 22
/sbin/halt 1
/sbin/shutdown 1
[root@shell ~]# # echo  ${!count[*]}  ==   count

4. 取出访问日志中每个IP的访问次数

[root@shell ~]# awk '{ips[$1]++}END{for (i in ips)print i,ips[i]}'  access.log  |sort -rnk2 |head
139.226.172.217 16033
47.102.42.79 1041
180.95.238.82 994
113.140.249.33 727
223.166.74.124 647
112.87.125.55 525
182.138.163.167 429
112.87.125.53 373
223.166.74.198 352
182.138.158.169 308

5. 统计出tcp的11种状态的数量

[root@shell ~]# netstat  -ant |awk 'NR>2{state[$NF]++}END{for (i in state)print i,state[i]}' 
LISTEN 6
ESTABLISHED 1

6. 统计出secure.log日志中破解你密码次数最多的10个IP

[root@shell01 ~]# sed -rn 's#(.*from )(.*)( port.*)#\2#gp' secure.log|awk '{ips[$1]++}END{for (i in ips){print i,ips[i]}}'|sort -rnk2|head|column -t
218.65.30.25    80102
218.65.30.53    40050
218.87.109.154  24742
112.85.42.103   21086
218.65.30.122   20030
112.85.42.99    20029
218.65.30.124   20027
218.65.30.123   20027
182.100.67.119  20027
218.87.109.151  20025



7. 统计出访问日志中每个IP的访问次数和每个IP对应返回的字节数量

[root@shell ~]# awk '{ips[$1]++;he[$1]+=$10}END{for (i in ips)print i,ips[i],he[i]}' access.log  |sort -rnk2 | head |column  -t
139.226.172.217  16033  749869585
47.102.42.79     1041   16462
180.95.238.82    994    154136
113.140.249.33   727    105270
223.166.74.124   647    93670
112.87.125.55    525    15640394
182.138.163.167  429    62205
112.87.125.53    373    10792077
223.166.74.198   352    61217
182.138.158.169  308    44660


8. 统计出访问日志中每个IP的每种状态码的数量

[root@shell ~]# awk '{status[$1" "$9]++}END{for (i in status)print i,status[i]}' access.log| sort -rnk3 | grep 139.226.172.217
139.226.172.217 200 14731
139.226.172.217 304 805
139.226.172.217 404 193
139.226.172.217 302 108
139.226.172.217 499 99
139.226.172.217 206 88
139.226.172.217 504 9
Copyright © 高程程 all right reserved,powered by Gitbook修订于: 2021-05-18 21:14:44

results matching ""

    No results matching ""